]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
messageTray: Limit number of notifications per source
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 13 Feb 2015 23:06:11 +0000 (00:06 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 20 Feb 2015 16:40:48 +0000 (17:40 +0100)
While applications can no longer spam the users with a constant stream
of banner notifications, it is still possible to drown the summary in
the message list. Avoid this by limiting the number of notifications a
single source is allowed to display simultaniously.

test-xy-stress in libnotify's tests suddenly became fun again ...

https://bugzilla.gnome.org/show_bug.cgi?id=744850

js/ui/messageTray.js

index 7dfa6c0f224e23722e787b21ca667be814e0d455..6b19d200438d0406bf16fa94b690fedcf025a62e 100644 (file)
@@ -28,6 +28,7 @@ const HIDE_TIMEOUT = 0.2;
 const LONGER_HIDE_TIMEOUT = 0.6;
 
 const MAX_NOTIFICATIONS_IN_QUEUE = 3;
+const MAX_NOTIFICATIONS_PER_SOURCE = 3;
 
 // We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD
 // range from the point where it left the tray.
@@ -43,10 +44,10 @@ const State = {
 };
 
 // These reasons are useful when we destroy the notifications received through
-// the notification daemon. We use EXPIRED for transient notifications that the
-// user did not interact with, DISMISSED for all other notifications that were
-// destroyed as a result of a user action, and SOURCE_CLOSED for the notifications
-// that were requested to be destroyed by the associated source.
+// the notification daemon. We use EXPIRED for notifications that we dismiss
+// and the user did not interact with, DISMISSED for all other notifications
+// that were destroyed as a result of a user action, and SOURCE_CLOSED for the
+// notifications that were requested to be destroyed by the associated source.
 const NotificationDestroyedReason = {
     EXPIRED: 1,
     DISMISSED: 2,
@@ -1304,6 +1305,9 @@ const Source = new Lang.Class({
         if (this.notifications.indexOf(notification) >= 0)
             return;
 
+        while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE)
+            this.notifications.shift().destroy(NotificationDestroyedReason.EXPIRED);
+
         notification.connect('destroy', Lang.bind(this, this._onNotificationDestroy));
         notification.connect('acknowledged-changed', Lang.bind(this, this.countUpdated));
         this.notifications.push(notification);